package com.spring.task.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;



public class ListUtil {

	/**
	 * 根据属性名获取List对象里的属性值列表
	 * @param list
	 * @param propertyName
	 * @return
	 */
	public static <T,F> List<F>  getPropertyValueListByProperty(List<T> list, String propertyName) {
		if (list == null || list.size() <= 0) {
			return null;
		}
		Field fieldList[] = list.get(0).getClass().getDeclaredFields();// 获得对象所有属性
		if (fieldList == null || fieldList.length <= 0) {
			return null;
		}
		boolean isExistsPropertyName = false;
		Field field=null;
		for (int i = 0; i < fieldList.length; i++) {
			if (propertyName.equals(fieldList[i].getName())) {
				isExistsPropertyName = true;
				field=fieldList[i];
				field.setAccessible(true);
				break;
			}
		}
		if(!isExistsPropertyName){
			throw new RuntimeException("propertyName不存在");
		}
		List<F> returnValue=new ArrayList<F>();
		for (Object obj : list) {
			try {
				returnValue.add((F) field.get(obj));
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				throw new RuntimeException(e);
				
			} catch (IllegalAccessException e1) {
				// TODO Auto-generated catch block
				throw new RuntimeException(e1);
			}
		}
		return returnValue;
	}

	public static <T> List<T> removeRepeat(List<T> list){
		if(list==null || list.size()<=1){
			return list;
		}
		
		HashSet<T> hashSet=new HashSet<T>();
		for (T object : list) {
			hashSet.add(object);
		}
		List<T> returnValue=new ArrayList<T>();
		for (T object : hashSet) {
			returnValue.add(object);
		}
		return returnValue;
	}
	
	/**
	 * 将list拆分成以,分隔的字符串
	 * @param list
	 * @return
	 */
	public static String getSplitStrByList(List<Long> list){
		String str="";
		if(list!=null && list.size()>0){
			for (Long long1 : list) {
				str+=long1+",";
			}
		}
		return str;
	}
	/** 
	* 将一个List按照固定的大小拆成很多个小的List 
	* 
	* @param listObj 
	*            需要拆分的List 
	* @param groupNum 
	*            每个List的最大长度 
	* @return 拆分后的List的集合 
	*/ 
	public static <T> List<List<T>> getSubList(List<T> listObj, int groupNum) { 
		List<List<T>> resultList = new ArrayList<List<T>>(); 
		// 获取需要拆分的List个数 
		int loopCount = (listObj.size() % groupNum == 0) ? (listObj.size() / groupNum) 
		: ((listObj.size() / groupNum) + 1); 
		// 开始拆分 
		for (int i = 0; i < loopCount; i++) { 
		// 子List的起始值 
		int startNum = i * groupNum; 
		// 子List的终止值 
		int endNum = (i + 1) * groupNum; 
		// 不能整除的时候最后一个List的终止值为原始List的最后一个 
		if (i == loopCount - 1) { 
		endNum = listObj.size(); 
		} 
		// 拆分List 
		List<T> listObjSub = listObj.subList(startNum, endNum); 
		// 保存差分后的List 
		resultList.add(listObjSub); 
		} 
		return resultList; 
	}
}
